#!/usr/bin/env python3
"""
快速XGBoost配置修复
直接应用优化的配置来解决R²=0.4068的问题
"""

import os
import sys
import logging
from pathlib import Path

# 添加项目根目录到路径
sys.path.append(str(Path(__file__).parent))

from backend.models.enhanced_dual_trainer import EnhancedDualTrainer

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

def main():
    """快速修复XGBoost配置"""
    logger.info("🔧 开始修复XGBoost配置...")
    
    try:
        # 创建训练器
        trainer = EnhancedDualTrainer()
        
        # 显示当前配置
        logger.info("📊 当前XGBoost配置（性能差 R²=0.4068）:")
        for key, value in trainer.xgboost_config.items():
            logger.info(f"   {key}: {value}")
        
        # 应用优化配置
        optimized_config = {
            'objective': 'reg:squarederror',
            'eval_metric': 'rmse',
            'max_depth': 8,  # 增加深度: 4 -> 8
            'learning_rate': 0.1,  # 提高学习率: 0.05 -> 0.1
            'n_estimators': 500,  # 增加树数量: 150 -> 500
            'subsample': 0.85,  # 提高采样率: 0.6 -> 0.85
            'colsample_bytree': 0.8,  # 提高特征采样: 0.6 -> 0.8
            'colsample_bylevel': 0.8,  # 提高层级采样: 0.6 -> 0.8
            'colsample_bynode': 0.8,  # 提高节点采样: 0.6 -> 0.8
            'gamma': 0.1,  # 降低分裂阈值: 5.0 -> 0.1
            'min_child_weight': 1,  # 降低权重限制: 3 -> 1
            'reg_alpha': 0.01,  # 降低L1正则化: 0.1 -> 0.01
            'reg_lambda': 0.01,  # 降低L2正则化: 0.1 -> 0.01
            'random_state': 42,
            'n_jobs': -1,
            'verbosity': 0,
            'tree_method': 'hist',  # 新增: 使用histogram方法
            'grow_policy': 'depthwise'  # 新增: 深度优先增长
        }
        
        logger.info("\n🚀 应用优化XGBoost配置:")
        for key, value in optimized_config.items():
            logger.info(f"   {key}: {value}")
        
        # 更新配置
        trainer.update_model_config('xgboost', optimized_config)
        
        logger.info("\n✅ XGBoost配置更新完成!")
        logger.info("🎯 预期性能提升:")
        logger.info("   - R² 从 0.4068 提升到 0.85+ (目标)")
        logger.info("   - MAE 从 851.98 降低到 300- (目标)")
        logger.info("   - 特征重要性更均衡")
        
        logger.info("\n🔄 现在可以重新训练模型:")
        logger.info("   1. 调用训练API: POST /api/v1/training/enhanced-dual")
        logger.info("   2. 或运行: python -m backend.models.enhanced_dual_trainer")
        
        # 可选：立即重新训练
        choice = input("\n是否立即重新训练XGBoost模型? (y/N): ").strip().lower()
        if choice in ['y', 'yes']:
            logger.info("🚀 开始重新训练...")
            results = trainer.train_all_models(train_range="3_months")
            
            if results:
                logger.info("\n📊 训练结果:")
                for model_name, metrics in results.items():
                    if isinstance(metrics, dict):
                        logger.info(f"   {model_name.upper()}:")
                        logger.info(f"     - MAE: {metrics.get('mae', 'N/A')}")
                        logger.info(f"     - R²: {metrics.get('r2', 'N/A')}")
                        logger.info(f"     - RMSE: {metrics.get('rmse', 'N/A')}")
                
                # 检查XGBoost性能是否改善
                xgb_metrics = results.get('xgboost', {})
                if isinstance(xgb_metrics, dict):
                    new_r2 = xgb_metrics.get('r2', 0)
                    new_mae = xgb_metrics.get('mae', 9999)
                    
                    if new_r2 > 0.7:  # 显著改善
                        logger.info(f"\n🎉 XGBoost性能显著改善!")
                        logger.info(f"   R² 提升: 0.4068 -> {new_r2:.4f}")
                        logger.info(f"   MAE 改善: 851.98 -> {new_mae:.2f}")
                    elif new_r2 > 0.5:  # 适度改善
                        logger.info(f"\n👍 XGBoost性能有所改善")
                        logger.info(f"   R² 提升: 0.4068 -> {new_r2:.4f}")
                        logger.info(f"   建议进一步调优特征工程")
                    else:
                        logger.warning(f"\n⚠️ XGBoost性能改善有限")
                        logger.warning(f"   R²: 0.4068 -> {new_r2:.4f}")
                        logger.warning(f"   可能需要更多数据或不同的特征工程策略")
            else:
                logger.error("❌ 训练失败")
        else:
            logger.info("✅ 配置已更新，请手动触发训练")
            
    except Exception as e:
        logger.error(f"❌ 修复失败: {e}")
        return False
    
    return True

if __name__ == "__main__":
    success = main()
    exit(0 if success else 1)